// struct

#include <stdio.h>

// 声明结构，date 是类型的名字，内部是结构的成员
// 每个 date 都会有这些成员
// 一般都声明在所有函数之前
struct date
{
    int month;
    int day;
    int year;
// 分号不可以丢！
};

int main(int argc, char const *argv[])
{
    // 在声明之前，要使用 struct <struct_name> <var_name>
    struct date today;

    // 结构成员：用 结构变量.结构成员 访问
    today.month = 03;
    today.day = 19;
    today.year = 2021;

    printf("Today's date is %i-%i-%i.\n", \
        today.year, today.month, today. day);

    // 另一种声明方式
    // 结构是无名的
    // p1, p2 都是这种结构的变量
    // 一般用于这个结构就在这两个变量下使的情况
    struct
    {
        int x;
        int y;
    } p1, p2;

    // 还可以两种都有
    struct point
    {
        int x;
        int y;
    } po1, po2;
    

    // 赋初值1
    struct date tomorrow = {03, 20, 2021};
    // 赋初值2
    // 如果没有全部给值，没给的就等于0
    struct date thismonth = {.month = 03, .year = 2021};

    printf("Tomorrow's date is %i-%i-%i.\n", \
        tomorrow.year, tomorrow.month, tomorrow. day);
    printf("Thismonth's date is %i-%i-%i.\n", \
        thismonth.year, thismonth.month, thismonth. day);


    // 结构运算
    po1 = (struct point){5, 10}; // 相当于 po1.x = 5; po1.y = 10;
    po2 = po1;  // 相当于 po2.x = po1.x; po2.y = po1.y;


    // 结构变量的变量名并不等于其地址，与数组不同
    // 要取地址需要 &
    struct date *pDate = &today;

    return 0;
}